package com.leosam.tvbox.mv.lucene;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

import com.leosam.tvbox.mv.data.Vod;
import com.leosam.tvbox.mv.utils.StringUtils;

public class MvIndex {

    private ConcurrentHashMap<String, Vod> idMap = new ConcurrentHashMap<>();
    private ConcurrentHashMap<String, Vod> nameMap = new ConcurrentHashMap<>();

    /**
     * 将影片添加到索引
     * 
     * @param vod 影片信息
     * @return 返回确认索引后的影片信息
     */
    public synchronized Vod indexVod(Vod vod) {
        String vodName = trimVodName(vod.getVodName());

        Vod oldVod = nameMap.get(vodName);
        if (oldVod != null) {
            if (oldVod == vod) {
                return vod;
            }
            vod.setVodId(oldVod.getVodId());
        }

        idMap.put(vod.getVodId(), vod);
        nameMap.put(vodName.toLowerCase(), vod);
        return vod;
    }

    /**
     * 对齐影片名
     * 
     * @return 返回影片名
     */
    public static String trimVodName(String vodName) {
        if (vodName != null) {
            vodName = vodName.trim();
        }
        if (StringUtils.isEmpty(vodName)) {
            throw new RuntimeException("无效影片: 没有指定影片名");
        }
        return vodName.replaceAll("([A-Za-z0-9])\\s+([A-Za-z0-9])", "$1 $2")
                .replaceAll("([^A-Za-z0-9])\\s+([^A-Za-z0-9])", "$1$2");
    }

    /**
     * 搜索影片
     * 
     * @param keyword 关键字
     * @return
     */
    public List<Vod> search(String keyword) {
        if (keyword == null) {
            return Collections.emptyList();
        } else {
            String low = keyword.toLowerCase();
            List<Vod> result = new ArrayList<Vod>();
            for (Entry<String, Vod> entry : nameMap.entrySet()) {
                if (entry.getKey().contains(low)) {
                    result.add(entry.getValue());
                }
            }
            if (result.size() > 1) {
                result = result.stream().sorted(new SimilarityScoreComparator(keyword)).collect(Collectors.toList());
            }
            return result;
        }
    }

    /**
     * 根据id获取影片
     * 
     * @param id id
     * @return 返回影片信息
     */
    public Vod getById(String id) {
        return idMap.get(id);
    }

    /**
     * 根据片名获取影响
     * 
     * @param name 影片名(小写,全局唯一名)
     * @return 返回影片信息
     */
    public Vod getByName(String name) {
        return nameMap.get(name);
    }

    /**
     * 根据影片名,返回影片ID
     * 
     * @param name 影片名
     * @return 返回影片ID,可能为null
     */
    public String getIdByName(String name) {
        Vod vod = nameMap.get(name);
        if (vod != null) {
            return vod.getVodId();
        }
        return null;
    }

    /**
     * 返回所有影片(按缓存时间排序,最晚缓存最前)
     * 
     * @return 返回影片信息
     */
    public List<Vod> getVodList() {
        return nameMap.values().stream().sorted(new Comparator<Vod>() {

            @Override
            public int compare(Vod o1, Vod o2) {
                return (int) (o2.getCacheTime() - o1.getCacheTime());
            };

        }).collect(Collectors.toList());
    }

}